package com.pai4j.remote.act;

import com.pai4j.common.bean.PAIResponseBean;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * 统一互动客户端远程接口
 * 为其他模块提供简洁、统一的互动功能远程调用接口
 * 基于Feign客户端，封装act模块的互动功能
 * 
 * 支持的功能：
 * - 基础互动：点赞、收藏、浏览、分享、推荐等
 * - 评论功能：评论、回复、删除评论等
 * - 指定用户操作：管理员代替用户或系统自动操作
 * - 自定义互动：支持任意行为类型的互动操作
 * - 配置化操作：可控制通知发送、行为追踪等
 * - 批量操作：支持批量处理多个资源
 * - 查询操作：检查互动状态、获取统计信息等
 * 
 * @author: CYM-pai
 * @date: 2025/08/11 13:00
 */
@FeignClient(name = "pai4j-act-service", contextId = "unifiedInteractionClient")
public interface IUnifiedInteractionClient {

    // ==================== 基础互动操作 ====================

    /**
     * 点赞操作
     * @param resourceType 资源类型 (MOMENT, ARTICLE, Course, SHOP_SKU)
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/like")
    PAIResponseBean<Long> like(@RequestParam("resourceType") String resourceType, 
                               @RequestParam("resourceId") Long resourceId);

    /**
     * 取消点赞操作
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/cancelLike")
    PAIResponseBean<Long> cancelLike(@RequestParam("resourceType") String resourceType, 
                                     @RequestParam("resourceId") Long resourceId);

    /**
     * 收藏操作
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/collect")
    PAIResponseBean<Long> collect(@RequestParam("resourceType") String resourceType, 
                                  @RequestParam("resourceId") Long resourceId);

    /**
     * 取消收藏操作
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/cancelCollect")
    PAIResponseBean<Long> cancelCollect(@RequestParam("resourceType") String resourceType, 
                                        @RequestParam("resourceId") Long resourceId);

    /**
     * 浏览操作（通常不发送通知）
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/view")
    PAIResponseBean<Long> view(@RequestParam("resourceType") String resourceType, 
                               @RequestParam("resourceId") Long resourceId);

    /**
     * 分享操作
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/share")
    PAIResponseBean<Long> share(@RequestParam("resourceType") String resourceType, 
                                @RequestParam("resourceId") Long resourceId);

    /**
     * 推荐操作
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/recommend")
    PAIResponseBean<Long> recommend(@RequestParam("resourceType") String resourceType, 
                                    @RequestParam("resourceId") Long resourceId);

    // ==================== 评论相关操作 ====================

    /**
     * 评论操作
     * @param resourceType 资源类型 (MOMENT, ARTICLE, Course, SHOP_SKU)
     * @param resourceId 资源ID
     * @param content 评论内容
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/comment")
    PAIResponseBean<Long> comment(@RequestParam("resourceType") String resourceType, 
                                  @RequestParam("resourceId") Long resourceId, 
                                  @RequestParam("content") String content);

    /**
     * 评论操作（指定接收者）
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param content 评论内容
     * @param targetUserId 目标用户ID（被评论的用户）
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/commentWithTarget")
    PAIResponseBean<Long> comment(@RequestParam("resourceType") String resourceType, 
                                  @RequestParam("resourceId") Long resourceId, 
                                  @RequestParam("content") String content, 
                                  @RequestParam("targetUserId") String targetUserId);


    @PostMapping("/act-service/unifiedInteraction/commentWithTarget")
    PAIResponseBean<Long> commentWithTarget(@RequestParam("resourceType") String resourceType,
                                            @RequestParam("resourceId") Long resourceId,
                                            @RequestParam("content") String content,
                                            @RequestParam("targetUserId") String targetUserId);

    /**
     * 回复评论操作
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param commentId 被回复的评论ID
     * @param content 回复内容
     * @param targetUserId 目标用户ID（被回复的用户）
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/reply")
    PAIResponseBean<Long> reply(@RequestParam("resourceType") String resourceType, 
                                @RequestParam("resourceId") Long resourceId, 
                                @RequestParam("commentId") Long commentId, 
                                @RequestParam("content") String content, 
                                @RequestParam("targetUserId") String targetUserId);

    /**
     * 删除评论操作
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param commentId 评论ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/deleteComment")
    PAIResponseBean<Long> deleteComment(@RequestParam("resourceType") String resourceType, 
                                        @RequestParam("resourceId") Long resourceId, 
                                        @RequestParam("commentId") Long commentId);

    // ==================== 指定用户的互动操作 ====================

    /**
     * 指定用户点赞操作
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/likeByUser")
    PAIResponseBean<Long> likeByUser(@RequestParam("userId") String userId, 
                                     @RequestParam("resourceType") String resourceType, 
                                     @RequestParam("resourceId") Long resourceId);

    /**
     * 指定用户收藏操作
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/collectByUser")
    PAIResponseBean<Long> collectByUser(@RequestParam("userId") String userId, 
                                        @RequestParam("resourceType") String resourceType, 
                                        @RequestParam("resourceId") Long resourceId);

    /**
     * 指定用户浏览操作
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/viewByUser")
    PAIResponseBean<Long> viewByUser(@RequestParam("userId") String userId, 
                                     @RequestParam("resourceType") String resourceType, 
                                     @RequestParam("resourceId") Long resourceId);

    /**
     * 指定用户评论操作
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param content 评论内容
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/commentByUser")
    PAIResponseBean<Long> commentByUser(@RequestParam("userId") String userId, 
                                        @RequestParam("resourceType") String resourceType, 
                                        @RequestParam("resourceId") Long resourceId, 
                                        @RequestParam("content") String content);

    /**
     * 指定用户评论操作（指定接收者）
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param content 评论内容
     * @param targetUserId 目标用户ID（被评论的用户）
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/commentByUserWithTarget")
    PAIResponseBean<Long> commentByUser(@RequestParam("userId") String userId, 
                                        @RequestParam("resourceType") String resourceType, 
                                        @RequestParam("resourceId") Long resourceId, 
                                        @RequestParam("content") String content, 
                                        @RequestParam("targetUserId") String targetUserId);


    @PostMapping("/act-service/unifiedInteraction/commentByUserWithTarget")
    PAIResponseBean<Long> commentByUserWithTarget(@RequestParam("userId") String userId,
                                                  @RequestParam("resourceType") String resourceType,
                                                  @RequestParam("resourceId") Long resourceId,
                                                  @RequestParam("content") String content,
                                                  @RequestParam("targetUserId") String targetUserId);

    /**
     * 指定用户回复评论操作
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param commentId 被回复的评论ID
     * @param content 回复内容
     * @param targetUserId 目标用户ID（被回复的用户）
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/replyByUser")
    PAIResponseBean<Long> replyByUser(@RequestParam("userId") String userId, 
                                      @RequestParam("resourceType") String resourceType, 
                                      @RequestParam("resourceId") Long resourceId, 
                                      @RequestParam("commentId") Long commentId, 
                                      @RequestParam("content") String content, 
                                      @RequestParam("targetUserId") String targetUserId);

    // ==================== 高级互动操作 ====================

    /**
     * 自定义互动操作
     * @param behaviorType 行为类型 (LIKE, COLLECT, VIEW, SHARE, RECOMMEND)
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/interact")
    PAIResponseBean<Long> interact(@RequestParam("behaviorType") String behaviorType, 
                                   @RequestParam("resourceType") String resourceType, 
                                   @RequestParam("resourceId") Long resourceId);

    /**
     * 指定用户的自定义互动操作
     * @param userId 用户ID
     * @param behaviorType 行为类型
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/interactByUser")
    PAIResponseBean<Long> interactByUser(@RequestParam("userId") String userId, 
                                         @RequestParam("behaviorType") String behaviorType, 
                                         @RequestParam("resourceType") String resourceType, 
                                         @RequestParam("resourceId") Long resourceId);

    /**
     * 取消互动操作
     * @param behaviorType 行为类型
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/cancelInteract")
    PAIResponseBean<Long> cancelInteract(@RequestParam("behaviorType") String behaviorType, 
                                         @RequestParam("resourceType") String resourceType, 
                                         @RequestParam("resourceId") Long resourceId);

    // ==================== 带配置的互动操作 ====================

    /**
     * 点赞操作（可配置是否发送通知）
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param enableNotification 是否发送通知
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/likeWithConfig")
    PAIResponseBean<Long> like(@RequestParam("resourceType") String resourceType, 
                               @RequestParam("resourceId") Long resourceId, 
                               @RequestParam("enableNotification") boolean enableNotification);

    /**
     * 收藏操作（可配置是否发送通知）
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param enableNotification 是否发送通知
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/collectWithConfig")
    PAIResponseBean<Long> collect(@RequestParam("resourceType") String resourceType, 
                                  @RequestParam("resourceId") Long resourceId, 
                                  @RequestParam("enableNotification") boolean enableNotification);

    /**
     * 自定义互动操作（可配置通知和行为追踪）
     * @param behaviorType 行为类型
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param enableNotification 是否发送通知
     * @param enableBehaviorTracking 是否启用行为追踪
     * @return 操作结果
     */
    @PostMapping("/act-service/unifiedInteraction/interactWithConfig")
    PAIResponseBean<Long> interact(@RequestParam("behaviorType") String behaviorType, 
                                   @RequestParam("resourceType") String resourceType, 
                                   @RequestParam("resourceId") Long resourceId, 
                                   @RequestParam("enableNotification") boolean enableNotification, 
                                   @RequestParam("enableBehaviorTracking") boolean enableBehaviorTracking);

    // ==================== 批量互动操作 ====================

    /**
     * 批量点赞操作（字符串参数）
     * @param resourceType 资源类型
     * @param resourceIds 资源ID列表（逗号分隔的字符串）
     * @return 操作结果列表
     */
    @PostMapping("/act-service/unifiedInteraction/batchLike")
    PAIResponseBean<List<Long>> batchLike(@RequestParam("resourceType") String resourceType, 
                                          @RequestParam("resourceIds") String resourceIds);

    /**
     * 批量点赞操作（List参数）
     *
     * @param resourceType 资源类型
     * @param resourceIds  资源ID列表
     * @return 操作结果列表
     */
    @PostMapping("/act-service/unifiedInteraction/batchLikeList")
    List<PAIResponseBean<Long>> batchLike(@RequestParam("resourceType") String resourceType,
                                          @RequestBody List<Long> resourceIds);

    /**
     * 批量收藏操作（字符串参数）
     * @param resourceType 资源类型
     * @param resourceIds 资源ID列表（逗号分隔的字符串）
     * @return 操作结果列表
     */
    @PostMapping("/act-service/unifiedInteraction/batchCollect")
    PAIResponseBean<List<Long>> batchCollect(@RequestParam("resourceType") String resourceType, 
                                             @RequestParam("resourceIds") String resourceIds);

    /**
     * 批量收藏操作（List参数）
     *
     * @param resourceType 资源类型
     * @param resourceIds  资源ID列表
     * @return 操作结果列表
     */
    @PostMapping("/act-service/unifiedInteraction/batchCollectList")
    List<PAIResponseBean<Long>> batchCollect(@RequestParam("resourceType") String resourceType,
                                             @RequestBody List<Long> resourceIds);

    // ==================== 查询操作 ====================

    /**
     * 检查用户是否已进行某种互动
     *
     * @param behaviorType 行为类型
     * @param resourceType 资源类型
     * @param resourceId   资源ID
     * @return 是否已互动
     */
    @PostMapping("/act-service/unifiedInteraction/checkInteraction")
    PAIResponseBean<Boolean> checkInteraction(@RequestParam("behaviorType") String behaviorType,
                                              @RequestParam("resourceType") String resourceType,
                                              @RequestParam("resourceId") Long resourceId);

    /**
     * 获取资源的互动统计
     *
     * @param resourceType 资源类型
     * @param resourceId   资源ID
     * @return 统计信息
     */
    @PostMapping("/act-service/unifiedInteraction/getInteractionStats")
    PAIResponseBean<Object> getInteractionStats(@RequestParam("resourceType") String resourceType,
                                                @RequestParam("resourceId") Long resourceId);
}
